#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)

#include <stdio.h>

//整型
//浮点型
//构造类型-自定义类型
//  数组
//  struct 结构体类型
//  enum 枚举
//  union 联合体
//指针类型
//空类型
//  void

//大端字节序和小端字节序
// 大端字节序：把数据的低位字节序的内容存放在高地址处，高位字节序的内容存放在低地址处
// 小端字节序：与之相反
//
//int main()
//{
//	int a = 0x11223344;	//小端字节序
//
//	return 0;
//}

//int main()
//{
//	//判断当前机器的字节序
//	int a = 1;
//	char* p = (char*)&a;
//	if (*p == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//
//	return 0;
//}

//int main()
//{
//	// 本质是把字符串首字符的地址存储在了指针变量中
//	char* ps = "Hello World";
//	printf("%c\n", *ps);	// h
//	printf("%s\n", ps);
//
//	return 0;
//}

//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char* str3 = "hello bit.";	// 常量字符串
//	const char* str4 = "hello bit.";
//
//	if (str1 == str2)
//	{
//		printf("str1 and str2 are same\n");
//	}
//	else
//	{
//		printf("str1 and str2 are not same\n");
//	}
//	
//	if (str3 == str4)
//	{
//		printf("str3 and str4 are same\n");
//	}
//	else
//	{
//		printf("str3 and str4 are not same\n");
//	}
//
//}

//int main()
//{
//	// 指针数组
//	// 数组 - 数组中存放的是指针（地址）
//	// int* arr[4];	// 存放整型指针的数组
//	int a[5] = { 1,2,3,4,5 };
//	int b[] = { 2,3,4,5,6 };
//	int c[] = { 3,4,5,6,7 };
//	int* arr[3] = { a,b,c };
//
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			//printf("%d ", *(arr[i] + j));
//			printf("%d ", arr[i][j]);	// 模拟二维数组，但地址不连续
//		}
//		printf("\n");
//	}
//
//	return 0;
//}


//数组指针 - 是指向数组的指针

//int main()
//{
//	int a = 10;
//	int* pa = &a;
//	char ch = 'w';
//	char* pc = &ch;
//	
//	//int arr[10] = { 1,2,3,4,5 };
//	//int (*parr)[10] = &arr;	//取出数组的地址
//	//parr就是一个数组指针 - 其中存放的是数组的地址
//
//	double* d[5];
//	double* (*pd)[5] = &d;
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//
//	int* p1 = arr;
//	int(*p2)[10] = &arr;
//
//	printf("%p\n", p1);
//	printf("%p\n", p1+1);
//	
//	printf("%p\n", p2);
//	printf("%p\n", p2+1);
//
//	return 0;
//}

//数组名是数组首元素的地址
//但是有2个例外：
//1. sizeof(数组名) - 数组名表示整个数组，计算的是整个数组的大小，单位是字节
//2. &数组名 - 数组名表示整个数组，取出的是整个数组的地址

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int(*pa)[10] = &arr;
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", *((*pa) + i));	// 不推荐
//	}
//
//	return 0;
//}

//void print1(int arr[3][5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//
//void print2(int(*p)[5], int r, int c)
//{
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", *(*(p + i) + j));
//		}
//		printf("\n");
//	}
//}
//
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//	print1(arr, 3, 5);
//	print2(arr, 3, 5);	//arr数组名，表示数组首元素的地址，二维数组的首元素是： 第一行！
//
//	return 0;
//}

//int i;	//全局变量，不初始化，默认0
//
//int main()
//{
//	i--;
//	if (i > sizeof(i))	//sizeof返回无符号整型，整型提升
//	{
//		printf(">\n");
//	}
//	else
//	{
//		printf("<\n");
//	}
//}

//打印0~100000之间的所有“自幂数”
//#include <math.h>
//int main()
//{
//	for (int i = 0; i < 100000; i++)
//	{
//		int n = 1;
//		int tmp = i;
//		while (tmp /= 10)
//		{
//			n++;
//		}
//
//		tmp = i;
//		int sum = 0;
//		while (tmp)
//		{
//			sum += pow(tmp % 10, n);
//			tmp /= 10;
//		}
//
//		if (sum == i && i!= 0)
//		{
//			printf("%d ", i);
//		}
//	}
//
//	return 0;
//}

//int main()
//{
//	int line = 0;
//	scanf("%d", &line);
//	for (int i = 0; i < line; i++)
//	{
//		//打印一行
//		for (int j = 0; j < line-1-i; j++)
//		{
//			printf(" ");
//		}
//		for (int j = 0; j < 2*i+1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//	for (int i = 0; i < line - 1; i++)
//	{
//		//打印一行
//		for (int j = 0; j <= i; j++)
//		{
//			printf(" ");
//		}
//		for (int j = 0; j < 2*(line-i-1)-1; j++)
//		{
//			printf("*");
//		}
//		printf("\n");
//	}
//
//	return 0;
//}

//int main()
//{
//	int money = 0;
//	scanf("%d", &money);
//	int total = 0;
//	if (money > 0)
//	{
//		total = 2 * money - 1;
//	}
//	/*int total = money;
//	int empty = money;
//	while (empty >= 2)
//	{
//		total += empty / 2;
//		empty = empty / 2 + empty % 2;
//	}*/
//	printf("%d\n", total);
//
//	return 0;
//}

//void move(int arr[], int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//
//	while (left < right)
//	{
//		// 从前往后找偶数
//		while (left < right && arr[left] % 2 == 1)
//		{
//			left++;
//		}
//		// 从后往前找奇数
//		while (left < right && arr[right] % 2 == 0)
//		{
//			right--;
//		}
//		if (left < right)
//		{
//			int tmp = arr[left];
//			arr[left] = arr[right];
//			arr[right] = tmp;
//		}
//	}
//}
//
//void print(int arr[], int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	move(arr, sz);
//	print(arr, sz);
//
//	return 0;
//}